package com.example.audiostreaming.views;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.example.audiostreaming.R;
import com.example.audiostreaming.base.BaseApplication;

/**
 * UI加载器，多状态界面切换
 * 帮助处理载入网络错误界面视图，数据正在加载界面视图，数据内容为空界面视图
 */
public abstract class ViewUILoader extends FrameLayout {

    private View mLoadingView;//正在加载视图
    private View mSuccessView;//加载成功视图
    private View mNetworkErrorView;//网络错误视图
    private View mEmptyView;//数据为空视图
    private OnRetryClickListener mOnRetryClickListener=null;

    //UI状态
    public enum UIStatus {
        LOADING,      //正在加载
        SUCCESS,      //加载成功
        NETWORK_ERROR, //网络错误
        EMPTY,         //数据为空
        NONE           //无状态
    }

    public UIStatus mCurrentUIStatus = UIStatus.NONE; //当前UI状态，默认是无状态

    public ViewUILoader(@NonNull Context context)  {
        this(context,null);//确保唯一入口
    }

    public ViewUILoader(@NonNull Context context, @Nullable AttributeSet attrs)  {
        this(context, attrs,0);//确保唯一入口
    }

    public ViewUILoader(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr)  {
        super(context, attrs, defStyleAttr);
        //初始化UI
        switchUIByCurrentStatus();//通过当前状态切换用户界面
    }


    /**
     * 更新状态
     * @param status
     */
    public void upDateStatus(UIStatus status) {
        mCurrentUIStatus = status;
        //更新UI在主线程上。
        BaseApplication.getHandler().post(new Runnable() {
            @Override
            public void run() {
                switchUIByCurrentStatus();
            }
        });
    }





    /**
     * 通过当前状态切换用户界面
     */
    private void switchUIByCurrentStatus() {
        //正在加载
        if (mLoadingView == null) {
            mLoadingView = getLoadingView();//获取正在加载视图
            addView(mLoadingView);
        }
        //根据状态设置是否可见
        mLoadingView.setVisibility(mCurrentUIStatus==UIStatus.LOADING ? VISIBLE : GONE);


        //加载成功
        if (mSuccessView == null) {
            //获取正在加载视图
            mSuccessView = getSuccessView(this);
            addView(mSuccessView);
        }
        //根据状态设置是否可见
        mSuccessView.setVisibility(mCurrentUIStatus==UIStatus.SUCCESS ? VISIBLE : GONE);


        //网络错误
        if (mNetworkErrorView == null) {
            //获取正在加载视图
            mNetworkErrorView = getNetworkErrorView();
            addView(mNetworkErrorView);
        }
        //根据状态设置是否可见
        mNetworkErrorView.setVisibility(mCurrentUIStatus==UIStatus.NETWORK_ERROR ? VISIBLE : GONE);


        //数据为空
        if (mEmptyView == null) {
            //获取正在加载视图
            mEmptyView = getEmptyView();
            addView(mEmptyView);
        }
        //根据状态设置是否可见
        mEmptyView.setVisibility(mCurrentUIStatus==UIStatus.EMPTY ? VISIBLE : GONE);
    }





    /**
     * 获取正在加载视图
     * @return
     */
    private View getLoadingView()   {
        return LayoutInflater.from(getContext()).inflate(R.layout.view_loading,this,false);

    }

    /**
     * 获取加载成功视图
     * @return
     */
    protected abstract View getSuccessView(ViewGroup container);

    /**
     * 获取网络错误视图
     * @return
     */
    private View getNetworkErrorView() {
        View networkErrorView=LayoutInflater.from(getContext()).inflate(R.layout.view_error,this,false);
        networkErrorView.findViewById(R.id.network_error).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //重新获取数据
                if (mOnRetryClickListener != null) {
                    mOnRetryClickListener.onRetryClick();
                }
            }
        });
        return networkErrorView;
    }

    /**
     * 获取数据为空视图
     * @return
     */
    protected View getEmptyView() {
        return LayoutInflater.from(getContext()).inflate(R.layout.view_empty,this,false);
    }



    public void setOnRetryClickListener(OnRetryClickListener onRetryClickListener){
        this.mOnRetryClickListener = onRetryClickListener;
    }

    public interface OnRetryClickListener{
        void onRetryClick();
    }
}
